// Copyright Druid Mechanics


#include "Actor/AuraFireBall.h"

#include "AbilitySystemBlueprintLibrary.h"
#include "AuraGameplayTags.h"
#include "AbilitySystem/AuraAbilitySystemLibrary.h"
#include "Components/AudioComponent.h"
#include "GameplayCueManager.h"

void AAuraFireBall::BeginPlay()
{
	Super::BeginPlay();
	StartOutgoingTimeline();
}

void AAuraFireBall::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
                                    UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	if(!IsValidOverlap(OtherActor))
	{
		return;
	}
	if (!bHit)
	{
		OnHit();
	}
	if (HasAuthority())
	{
		if (UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(OtherActor))
		{
			const FVector DeathImpulse = GetActorForwardVector() * DamageEffectParams.DeathImpulseMagnitude;
			DamageEffectParams.DeathImpulse = DeathImpulse;
			DamageEffectParams.TargetAbilitySystemComponent = TargetASC;
			UAuraAbilitySystemLibrary::ApplyDamageEffect(DamageEffectParams);
		}
	}
}

void AAuraFireBall::OnHit()
{
	if(GetOwner())
	{
		FGameplayCueParameters CueParameters;
		CueParameters.Location = GetActorLocation();
		/**
		 * 针对触发非复制GC事件的便捷方法。
		 * 我们希望避免让设计师面临"这个GC是要进行网络同步(复制)还是不进行网络同步(复制)?"这样的选择。
		 * 大多数情况下，我们要为他们做决定：
		 * -GA将始终使用网络同步(复制)的GC事件，因为它们不会在模拟代理上执行。
		 * -动画始终使用非网络同步(复制)的GC事件，因为它们总是在模拟代理上执行。
		 * 有时候，给设计师提供这两种选择会很有用：比如在有很多可能使用场景的演员类(游戏中一般指可交互对象类)里。
		 * 不过，我们应该把这种选择限制在演员类内部，而不是全局适用。例如，不要在函数库中同时添加这两种选择，
		 * 因为这样它们会在所有地方都出现。要把这些选择添加到演员类中，这样它们就只会在该类里出现。
		 */
		UGameplayCueManager::ExecuteGameplayCue_NonReplicated(GetOwner(), FAuraGameplayTags::Get().GameplayCue_FireBlast, CueParameters);
	}
	if (LoopingSoundComponent)
	{
		LoopingSoundComponent->Stop();
		LoopingSoundComponent->DestroyComponent();
	}
	bHit = true;
}
